package main

import (
	"fmt"
	"math/rand"
	"sort"
	"time"
)

// 作业1
func homework1() {
	/*
		s1内元素: [0 0 0]
		s2内元素：[0 0 0 1]
		s1修改一个元素会影响s2，s2修改一个元素不一定会影像s1。原因：s1和s2是切片，且s2是s1追加元素得来（未扩容生成新的数组），s1和s2共用底层数组，因此修改s1会影响s2，当修改s2前三个元素的时候,s1也会跟着修改，当修改第四个元素的时候，由于s1长度只有3，虽然底层数组也被修改了，但是截取长度有限，不会受到影像。

		s2再增加一个元素，会使s2脱离原先的底层数据，拷贝原来底层数组数据并生成新的数组，且容量变为原来的2倍（此处容量为8，长度为5）。
	*/
}

// 作业2 有一个数组 [1,4,9,16,2,5,10,15]，生成一个新切片，要求新切片元素是数组相邻2项的和。
func generateSlices() {
	arr := [...]int{1, 4, 9, 16, 2, 5, 10, 15}
	var sli = make([]int, 0, len(arr))
	for i, _ := range arr {
		// fmt.Println(i)
		if i+1 >= len(arr) {
			break
		}
		sli = append(sli, arr[i]+arr[i+1])
	}
	fmt.Println(sli)
	// fmt.Printf("%d,%d,%v\n", len(sli), cap(sli), sli)
}

/*
作业3：数字重复统计

	随机产生100个整数
	数字的范围[-100, 100]
	降序输出这些生成的数字并打印其重复的次数
*/
func numRepeatStat() {
	// for i := 0; i < 20; i++ { //随机产生100个整数
	// 	fmt.Println(rand.Intn(200) - 100) //数字的范围[-100, 100]
	// }
	var sli = make([]int, 0, 100)
	// var m = map[int]int{}
	var m = make(map[int]int, 100)
	src := rand.New(rand.NewSource(time.Now().UnixNano()))
	for i := 0; i < 100; i++ {
		num := src.Intn(201) - 100
		sli = append(sli, num)
		// fmt.Printf("%T\n", num)
		// fmt.Println(m[num])
		// if m[num] != 0 {
        if _, ok := m[num]; ok {
			m[num] += 1
		} else {
			m[num] = 1
		}
	}
	// fmt.Println(sli)
	// sort.Ints(sli)
	// 随机数降序排序
	sort.Sort(sort.Reverse(sort.IntSlice(sli)))
	fmt.Println(sli)
	// fmt.Println(m)
	// fmt.Println(len(sli))
	// fmt.Println(len(m))
	//降序输出这些生成的数字并打印其重复的次数
	for k, v := range m {
		fmt.Printf("随机数: %d, 重复出现次数: %d\n", k, v)
	}

}

/*
作业4：简述线性数据结构和哈希表优劣

线性表：线性表结构是一种按照顺序存储和访问元素的数据结构，其中包括数组、链表、栈和队列。
优点：
	1、线性表数据结构操作相对简单；
	2、线性表支持顺序访问元素，适用于遍历和按照顺序处理元素的场景。
缺点：
	1、插入和删除效率较低，插入删除元素可能需要移动其他元素，导致效率较低；
	2、对于大型数据结构，查找某个元素需要遍历整个数据结构，效率较低。

哈希表：是一种给予哈希函数实现的数据结构，是一种键映射到值得存储方式。
优点:
	1、快速查找，通过哈希函数可以快速计算出元素的存储位置，从而实现快速查找；
	2、高效的插入和删除，哈希表的插入和删除操作通常效率较高，不受数据规模的影响；
    3、哈希表适用于存储数据规模较大的数据场景，因为他的查找和插入操作的时间复杂度是O(1)
缺点：
	1、内存消耗较高，哈希表需要额外的内存空间来存储哈希函数和冲突处理的相关信息
	2、冲突处理，哈希函数可能会导致多个键映射到同一个位置，需要进行冲突处理，从而影响性能
	3、哈希表中的元素存储是无序的，不适用于保持顺序存储的场景


*/

func main() {
	// homework1()
	generateSlices() // 作业2
	numRepeatStat()

}


// 批改意见
// 1. 第3题可以尝试一下倒序输出这些元素的同时，也输出它重复的次数。 另外几题都完成的很不错。